package com.best.config;

import com.best.bean.Color;
import com.best.bean.Person;
import com.best.condition.LinuxCondition;
import com.best.condition.MyImportBeanDefinitionRegister;
import com.best.condition.MyImportSelector;
import com.best.condition.WindowsCondition;
import org.springframework.context.annotation.*;

//满足当前条件，这个类中配置的所有bean注册才能生效
@Conditional({WindowsCondition.class})
@Configuration
//@Import导入组件，id默认是组件的全类名
@Import({Color.class, MyImportSelector.class, MyImportBeanDefinitionRegister.class})
public class MainConfig2 {

    /**
     * 默认都是单实例的
     * prototype: 多实例的, ioc容器启动并不会去调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象。
     * singleton: 单实例的(默认值), ioc容器启动会调用方法创建对象放到ioc容器中。以后每次获取就直接从容器(map.get())中拿。
     * request: 同一个请求创建一个实例
     * session: 同一个session创建一个实例
     *
     * 懒加载：
     *      单实例bean: 默认在容器启动的时候创建对象;
     *      懒加载: 容器启动不创建对象。第一次使用(获取)Bean创建对象，并初始化。
     * @return
     */
//    @Scope("prototype")
    @Bean("person2")
    @Lazy
    public Person person() {
        System.out.println("给容器中添加Person....");
        return new Person("张三", 25);
    }

    /**
     * @Conditional({Condition}), 按照一定的条件进行判断，满足条件给容器中注册bean
     *
     * 如果系统是windows，给容器中注册("bill")
     * 如果系统是linux，给容器中注册("linux")
     */

    @Conditional({WindowsCondition.class})
    @Bean("bill")
    public Person person01() {
        return new Person("bill ", 62);
    }

    @Conditional({LinuxCondition.class})
    @Bean("linux")
    public Person person02() {
        return new Person("linux", 48);
    }

    /**
     * 给容器中注册组件:
     * 1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component[自己的类])
     * 2)、@Bean[导入的第三方包里面的组件]
     * 3)、@Import[快速给容器中导入一个组件]
     *          1).Import(要导入到容器中的组件);容器中就会自动注册这个组件，id默认是全类名
     *          2).ImportSelector: 返回需要导入的组件的全类名数组；
     *          3).ImportBeanDefinitionRegister:手动注册bean到容器中
     */
}
